从CGI、FastCGI、php-fpm 说起

mod_phpCGIFastCGI

PHP 解释器的执行,主要有三者模式,mod_php、CGI 和FastCGI。

  • mode_php 是Apache 的一个模块,把PHP 解释器嵌入到Apache 进程中。
  • CGI 和FastCGI 分别是一种协议。Web Server 实现了CGI 或FastCGI 协议的相应的应用程序(以下简称CGI 或FastCGI),就可以启动PHP 解释器处理PHP 请求。它们都是以独立进程的形式存在。
  • mode_php 和FastCGI 在 单个进程中可以处理多个请求,CGI 在单个进程中只能处理一个请求。

php-cgi 是一种CGI 协议的实现

  • php-cgi 其实就是PHP 解析器
  • 在CGI 模式时,当Web Server 收到 xx/index.php 请求时,会启动php-cgi,php-cgi 会解析php.ini 文件,初始化环境,然后根据请求参数进行处理,再返回处理后的结果。(都是以CGI 协议规范来进行)
  • php-cgi 在每个请求时都会启动一个进程,然后读取php.ini 进行解析,可想而知效率相对比较低。
  • php-cgi 无法实现平滑重启。修改php.ini 配置后,后面启动的php-cgi 程序还是不会感知。

php-fpm 即FastCGI Process Management,是一种FastCGI 协议的实现

  • 当请求到来时,php-fpm 启动并读取php.ini 文件完成初始化环境,然后启动一个master,再启动多个worker。当请求过来时,master 会传递给一个worker,然后等待下一个请求。php-fpm 会动态配置worker 的数量。
  • 一个php-fpm 进程可以处理多个请求,会启动多个php-cgi 程序。
  • php-fpm 可以实现平衡重启。修改php.ini 后,当启用新的worker 会使用新的配置。
如果本文对你有所帮助,可以支持一下博主。